wayland: Add get_monitor_at_window to Wayland backend
authorOlivier Fourdan <ofourdan@redhat.com>
Tue, 17 May 2016 13:04:23 +0000 (15:04 +0200)
committerOlivier Fourdan <ofourdan@redhat.com>
Wed, 18 May 2016 17:07:27 +0000 (19:07 +0200)
Given that Wayland has no global coordinate, the only way for gdk to
retrieve the monitor a window last entered is to retrieve it from the
GdkWaylandWindow itself.

Implement the backend specific get_monitor_at_window() to return the
monitor that was last entered by the window.

https://bugzilla.gnome.org/show_bug.cgi?id=766566

gdk/wayland/gdkdisplay-wayland.c

index 7b54c7749d8ac3ea293a2389f01cf3e0edeced8a..c541a6a0b8454c76ae6443edd3b2ae889251e39d 100644 (file)
@@ -37,6 +37,7 @@
 #include "gdkkeysprivate.h"
 #include "gdkprivate-wayland.h"
 #include "gdkglcontext-wayland.h"
+#include "gdkwaylandmonitor.h"
 #include "pointer-gestures-unstable-v1-client-protocol.h"
 #include "tablet-unstable-v1-client-protocol.h"
 
@@ -840,6 +841,31 @@ gdk_wayland_display_get_monitor (GdkDisplay *display,
   return (GdkMonitor *)display_wayland->monitors->pdata[monitor_num];
 }
 
+static GdkMonitor *
+gdk_wayland_display_get_monitor_at_window (GdkDisplay *display,
+                                           GdkWindow  *window)
+{
+  GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
+  struct wl_output *output;
+  int i;
+
+  g_return_val_if_fail (GDK_IS_WAYLAND_WINDOW (window), NULL);
+
+  output = gdk_wayland_window_get_wl_output (window);
+  if (output == NULL)
+    return NULL;
+
+  for (i = 0; i < display_wayland->monitors->len; i++)
+    {
+      GdkMonitor *monitor = display_wayland->monitors->pdata[i];
+
+      if (gdk_wayland_monitor_get_wl_output (monitor) == output)
+        return monitor;
+    }
+
+  return NULL;
+}
+
 static void
 gdk_wayland_display_class_init (GdkWaylandDisplayClass *class)
 {
@@ -894,6 +920,7 @@ gdk_wayland_display_class_init (GdkWaylandDisplayClass *class)
 
   display_class->get_n_monitors = gdk_wayland_display_get_n_monitors;
   display_class->get_monitor = gdk_wayland_display_get_monitor;
+  display_class->get_monitor_at_window = gdk_wayland_display_get_monitor_at_window;
 }
 
 static void